home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CALEMU
/
TNCALEMU.S
< prev
Wrap
Text File
|
1995-03-20
|
15KB
|
814 lines
*.include tnb.mac
DI macro
ori.w #$0700,sr
.endm
EI macro
andi.w #$F8FF,sr
.endm
SUPER macro
moveq #$81,d0
trap #15
.endm
USER macro
moveq #$81,d0
trap #15
.endm
.include iocscall.mac
.include doscall.mac
_TABLET equ $3B
*macro TabConChk
* moveq #$83,d1
* IOCS _TABLET
* tst.l d0
* .endm
TabConChk: .macro
moveq #_TABLET,d0
move.l #$8001,d1
trap #15
cmpi.w #'TB',d0
.endm
StartStatio:*******************常駐部
SS:
jmp init-SS(a4)
head:
HEAD1 = 'CALE'
HEAD2 = 'MU05'
.dc.l HEAD1
.dc.l HEAD2
.even
st:
SET232C:*---------------------------
* ($130)[$04C0]
* IOCS $30 SET232C
* RS-232Cのモード設定
* [リターン] 前のモード
SET232C_ = $04C0.w
clr.w CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
tst.w d1
bmi SET232C_JMP *-1なら
movem.l d0-d1,-(sp)
moveq #_TABLET,d0
move.l #$8001,d1
trap #15
cmpi.w #'TB',d0
bne @f
moveq #_TABLET,d0
move.l #$81FF,d1
trap #15
cmpi.l #$8300,d0
eori.b #4,ccr
@@:
movem.l (sp)+,d0-d1
bne @f
*初期化
clr.l _OutLg
move.l #_OutBuf,_OutPt
move.l #_OutBuf,_OutWt
move.w #-1,CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
@@:
SET232C_JMP:
jmp $00000000.l
LOF232C:*---------------------------
* ($131)[$04C4]
* IOCS $70 LOF232C
* パッファ内のデータ量
* [リターン] データ数
LOF232C_ = $04C4.w
tst.w CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
bne @f
LOF232C_JMP:
jmp $00000000.l
@@:
move.l _OutLg(pc),d0
rts
INP232C:*---------------------------
* ($132)[$04C8]
* IOCS $70 INP232C
* 受信データ取得
* [リターン] データ(byte)
INP232C_ = $04C8.w
tst.w CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
bne @f
INP232C_JMP:
jmp $00000000.l
@@:
moveq #0,d0
tst.l _OutLg
beq INP_L1
move.l a0,-(sp)
movea.l _OutPt(pc),a0
move.b (a0)+,d0
cmp.l #_OutBuf_E,a0
bne @f
move.l #_OutBuf,a0
@@: move.l a0,_OutPt
subq.l #1,_OutLg
movea.l (sp)+,a0
INP_L1: rts
ISNS232C:*---------------------------
* ($133)[$04CC]
* IOCS $70 ISNS232C
* データチェック
* [リターン] 受信データのチェック
ISNS232C_ = $04CC.w
tst.w CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
bne @f
ISNS232C_JMP:
jmp $00000000.l
@@:
moveq #0,d0
tst.l _OutLg
beq @f
move.l a0,-(sp)
movea.l _OutPt(pc),a0
move.b (a0),d0
movea.l (sp)+,a0
ori.l #$010000,d0
@@: rts
OSNS232C:*---------------------------
* ($134)[$04D0]
* IOCS $70 OSNS232C
* 出力可能か?
* [リターン] 0:不可 4:可能
OSNS232C_ = $04D0.w
movem.l d0-d1,-(sp)
moveq #_TABLET,d0
move.l #$8001,d1
trap #15
cmpi.w #'TB',d0
bne @f
moveq #_TABLET,d0
move.l #$81FF,d1
trap #15
cmpi.l #$8300,d0
eori.b #4,ccr
@@: movem.l (sp)+,d0-d1
beq @f
clr.w CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
OSNS232C_JMP:
jmp $00000000.l
@@:
moveq #4,d0 *送信可能
move.w #-1,CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
rts
OUT232C:*---------------------------
* ($135)[$04D4]
* IOCS $70 OUT232C
* データ送信
* [リターン] なし
OUT232C_ = $04D4.w
tst.w CnChk *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
bne @f
OUT232C_JMP:
jmp $00000000.l
@@:
*clr.l _OutLg
*move.l #_OutBuf,_OutPt
*move.l #_OutBuf,_OutWt
movem.l d0-d1/a0-a3,-(sp)
movea.l _InpPt(pc),a0
movea.l a0,a3 *記憶
move.b d1,(a0)+
cmpa.l #_InpBuf_E,a0
bne @f
movea.l #_InpBuf,a0
@@: move.l a0,_InpPt
cmpi.b #'?',d1 * ?
beq OT2C_?
cmpi.b #$1B,d1 *ESC
beq OT2C_ESC
cmpi.b #'%',d1 *%
beq OT2C_PAR
cmpi.b #$0D,d1 *CR
beq OT2C_CR
clr.l _InpESC *ESCフラグ
bra OUT232C_EE
OT2C_?:*---[?]だったら
tst.l _InpChPt
bne @f
jbsr _MakeTable
clr.l _InpESC *ESCフラグ
@@: bra OUT232C_EE
OT2C_ESC:*---[ESC]だったら
move.l #1,_InpESC *ESCフラグON
clr.l _InpChPt
bra OUT232C_EE
OT2C_PAR:*---[%]だったら
tst.l _InpESC *ESCフラグ
beq OUT232C_EE
move.l a3,_InpChPt *%の位置記憶
clr.l _InpESC *ESCフラグ
bra OUT232C_EE
OT2C_CR:*---
clr.l _InpESC *ESCフラグ
tst.l _InpChPt
beq OUT232C_EE *ESCがないなら終わり
*-文法解析
bsr _foo
clr.l _InpChPt
OUT232C_EE:
movem.l (sp)+,d0-d1/a0-a3
rts
.globl _MakeTable
_MakeTable:***********************
*
* 接続チェックはしておくこと
*
* _TB_POSGT [$82] タブレットステイタス読み込み [Tablet Mode]
* [ In ] なし [ Out ] d0.w =SideSw.[0/255]*256+筆圧[0-126]
* d1.l =XPos[0-1280]*65536+YPos[0-960]
*
*--JOYGET($8002) 座標値
*
*[戻り値] X*0x10000+Y (X;0-1280,Y;0-960)
*
*--JOYGET($8005) トリガー2
*
*[戻り値] bit15:click(pen) bit14:プレス bit6-0:筆圧(変換)
*
movem.l d0/d1/d2/d3/d7/a0,-(sp)
.if 0
*座標無しならいらない
move.l #$8001,d1
moveq.l #$3B,d0
trap #15
cmpi.l #$00315442,d0 *'1TB'
bne MT_EE
.endif
lea AFT0(pc),a0
move.l #$8005,d1
IOCS _TABLET
move.w d0,d1
andi.w #$007F,d1
.if 0
*G モード 試作
beq MT_LL1
move.w GPen(pc),d2 * 1以上でG-PENもーど GPenまでは筆圧1となる
beq MT_LL1
sub.w d2,d1 * d2=40 p'-40
bhi @f
moveq #5,d1 *40未満は筆圧1
beq MT_LL1
@@:
tst.w d1
bne @f
moveq #5,d1 *40調度も
beq MT_LL1
@@: * p'=0~87
moveq #$7F,d3 * d3=127
sub.w d2,d3 * d3=127-40 = 87
mulu #127-5,d1 * p'=p'*127
divu d3,d1 * p =p'/87
bpl @f
moveq #0,d1
@@:
addq.w #5,d1
andi.w #$007F,d1
MT_LL1:
.endif
move.b d1,8(a0) *筆あつ
move.b #$80,(a0)
tst.w d0
bpl MT_LL3
btst.b #0,$80E.w
bne @f
or.b #$08,(a0)
bra MT_LL3
@@: or.b #$10,(a0)
MT_LL3:
btst #14,d0
beq MT_LL2
or.b #$04,(a0)
MT_LL2:
clr.b 6(a0)
clr.b 7(a0)
clr.b 9(a0)
.if 0
*座標計算設定
move.l #$8003,d1
IOCS _TABLET
move.l d0,d1
move.l d1,d7
swap d7 *x 1280
move.w d7,d0
andi.b #$7F,d0
move.b d0,2(a0)
lsr.w #7,d7
move.w d7,d0
andi.b #$7F,d0
move.b d0,1(a0)
lsr.w #7,d7
move.w d7,d0
andi.b #$03,d0
or.b d0,(a0)
lsl.w #1,d7
andi.b #$18,d7
move.b d7,3(a0)
swap d7 *y 960
*move.w #960,d0
move.w #511,d0
sub.w d7,d0
move.w d0,d7
andi.b #$7F,d0
move.b d0,5(a0)
lsr.w #7,d7
move.w d7,d0
andi.b #$7F,d0
move.b d0,4(a0)
lsr.w #7,d7
move.w d7,d0
andi.b #$07,d0
or.b d0,3(a0)
.else
*座標無し
clr.b 1(a0)
clr.b 2(a0)
clr.b 3(a0)
clr.b 4(a0)
clr.b 5(a0)
.endif
pea.l AFT0
pea.l 10.w
jbsr _OutData
addq.w #8,sp
MT_EE: movem.l (sp)+,d0/d1/d2/d3/d7/a0
rts
*---work
AFT0: .dc.b 0 **1 C4 C3 C2 C1 C0 X15 X14
AFT1: .dc.b 0 **0 X13 X12 X11 X10 X9 X8 X7
AFT2: .dc.b 0 **0 X6 X5 X4 X3 X2 X1 X0
AFT3: .dc.b 0 **0 0 PR X17 X16 Y16 Y15 Y14
AFT4: .dc.b 0 **0 Y13 Y12 Y11 Y10 Y9 Y8 Y7
AFT5: .dc.b 0 **0 Y6 Y5 Y4 Y3 Y2 Y1 Y0
AFT6: .dc.b 0 **0 XT6 XT5 XT4 XT3 XT2 XT1 XT0
AFT7: .dc.b 0 **0 YT6 YT5 YT4 YT3 YT2 YT1 YT0
AFT8: .dc.b 0 **0 P6 P5 P4 P3 P2 P1 P0
AFT9: .dc.b 0 **0 H6 H5 H4 H3 H2 H1 H0
.even
*---work
MAX equ 512
MAY equ 512
_AFTMAX:
.dc.b ((MAX/$4000)&3)|$80 *//1 C4 C3 C2 C1 C0 X15 X14
.dc.b (MAX/$80)&$7F *//0 X13 X12 X11 X10 X9 X8 X7
.dc.b MAX&$7F *//0 X6 X5 X4 X3 X2 X1 X0
.dc.b ((MAX/$10000)&3)*8|((MAY/$4000)&7) *//0 0 PR X17 X16 Y16 Y15 Y14
.dc.b (MAY/$80)&$3F *//0 Y13 Y12 Y11 Y10 Y9 Y8 Y7
.dc.b MAY&$7F *//0 Y6 Y5 Y4 Y3 Y2 Y1 Y0
.dc.b 0 *//0 XT6 XT5 XT4 XT3 XT2 XT1 XT0
.dc.b 0 *//0 YT6 YT5 YT4 YT3 YT2 YT1 YT0
.dc.b 0 *//0 P6 P5 P4 P3 P2 P1 P0
.dc.b 0 *//0 H6 H5 H4 H3 H2 H1 H0
.even
.include TnCALE__.s
CnChk: .dc.w 0 *CalEmu内部用 タブレットコネクトフラグ 0:no -1:コネクト
GPen: .dc.w 64 * 1以上でG-PENもーど GPenまでは筆圧1となる
.globl _OutData
_OutData:*
* Long,DATAアドレス
* a1 破壊
*
movem.l d0/a0/a1,-(sp)
movem.l 4+4*3(sp),d0/a0
add.l d0,_OutLg
subq.l #1,d0
movea.l _OutWt(pc),a1
OD_L1: move.b (a0)+,(a1)+
cmpa.l #_OutBuf_E,a1
bne @f
movea.l #_OutBuf,a1
@@: move.l a1,_OutWt
dbra d0,OD_L1
movem.l (sp)+,d0/a0/a1
rts
*---outputデータ
_OutPt:
.dc.l _OutBuf *出力パッファ ポインタ
_OutWt:
.dc.l _OutBuf *パッファ末 ポインタ
_OutLg:
.dc.l 0 *出力待ち文字数
_OutBuf:
.ds.b 32
.even
_OutBuf_E:
*---inputデータ
_InpESC:
.dc.l 0 *ESCフラグ
_InpChPt:
.dc.l 0 *チェック開始ポインタ ('%'の場所)
_InpPt:
.dc.l _InpBuf *管理ポインタ
_InpBuf:
.ds.b 32
.even
_InpBuf_E:
.dc.l _InpBuf_E-_InpBuf
EndStatio:*******************常駐部
MarkerChk:*----------------------------------------
* a0 アドレス
*
*[戻り値] bne ちがう
* beq あっている
cmpa.l #$00F00000,a0
bcc @f
cmp.l #HEAD1,(a0)
bne @f
cmp.l #HEAD2,4(a0)
bne @f
cmpa.l a0,a0 *z=1
@@:
rts
InvChk:*----------------------------------------
* a0.l==なら非常駐
* a0.l!=なら常駐
movea.l (a0),a0 *一つ前のポインタ
cmpa.l #$00F00000,a0
bcc IC1
cmp.l #HEAD1,$0104(a0)
bne @f
cmp.l #HEAD2,$0108(a0)
bne @f
adda.w #$100,a0 **[SS]のポインタ
rts
@@: **違う
tst.l (a0) *一つ前のポインタ
bne InvChk *0でない(上へ)
IC1: sub.l a0,a0 *非常駐
rts
AtoI:*----------------------------------------
* a2 アドレス
*[戻り値] d0.l 数字
moveq #0,d0
@@: move.b (a2)+,d2
subi.b #'0',d2
bcs AIr
cmpi.b #9,d2
bhi AIr
andi.l #$0000FF,d2
mulu #10,d0
add.l d2,d0
bra @b
AIr: subq #1,a2
rts
init:*------------------------------------------------------------------
lea usrsp,sp
pea LR1(pc)
DOS _PRINT
addq.w #4,sp
** 常駐チェック **
suba.l a1,a1
SUPER
movea.l d0,a1
moveq #0,d1
bsr InvChk
movea.l a0,a3 *常駐先頭アドレス
movea.l SET232C_,a0
subq #SET232C-head,a0
bsr MarkerChk
bne @f
bset #0,d1
@@: movea.l LOF232C_,a0
suba #LOF232C-head,a0
bsr MarkerChk
bne @f
bset #1,d1
@@:
movea.l INP232C_,a0
suba #INP232C-head,a0
bsr MarkerChk
bne @f
bset #2,d1
@@:
movea.l ISNS232C_,a0
suba #ISNS232C-head,a0
bsr MarkerChk
bne @f
bset #3,d1
@@:
movea.l OSNS232C_,a0
suba #OSNS232C-head,a0
bsr MarkerChk
bne @f
bset #4,d1
@@:
movea.l OUT232C_,a0
suba #OUT232C-head,a0
bsr MarkerChk
bne @f
bset #5,d1
@@: *d1に常駐状態
USER
** 常駐していたらそのデータを引用 **
move.l a3,d0
beq conl
move.w GPen-SS(a3),GPen
conl: ** コマンドラインチェック **
tst.b (a2)+ *スキップ
sw: move.b (a2)+,d0
beq keep
cmpi.b #' ',d0
beq sw
cmpi.b #$09,d0 *tab
beq sw
cmpi.b #'-',d0
beq swc
cmpi.b #'/',d0
beq swc
swe: pea LR6(pc)
bra PE *end
swc: **スイッチ判断
move.b (a2)+,d0
beq swe
cmpi.b #'?',d0
beq help
ori.b #$20,d0 *小文字化!
cmpi.b #'r',d0
beq free
cmpi.b #'g',d0
beq gswc
cmpi.b #'m',d0
beq mswc
cmpi.b #'h',d0
beq help
swcerr: pea LR7(pc)
bra PE *end
gswc:******************
bsr AtoI
cmpi.l #128,d0
bcc swcerr
move.w d0,GPen *G-PENエミュ(def.64)
bra sw
mswc:******************
clr.w GPen *G-PENエミュ(def.64)
bra sw
help:******************
pea LRH(pc)
bra PE *end
keep: ************************** 常駐させる
move.l #$8000,d1
IOCS _TABLET
cmpi.w #$5442,d0
beq @f
*TnTABLETが常駐していない!
pea LRTTN(pc)
bra PE *end
@@:
swap d0
cmpi.w #$0092,d0
bcc @f
*TnTABLETが古い!
pea LRTTO(pc)
bra PE *end
@@: *TnTABLETのモード変更
move.l #$8080,d1 *ボタン機能 ノーマル
IOCS _TABLET
move.l #$8090,d1 *ジョイスティックエミュ禁止
IOCS _TABLET
move.l #$8281,d1 *1: CRTMODによる移動範囲を判別。
IOCS _TABLET
move.l #$80A3,d1 *3: キーによる機能あり
IOCS _TABLET
move.l #$81FF,d1 *モードチェック
IOCS _TABLET
cmpi.l #$8300,d0
bne @f
move.l #$8100,d0
@@: move.l d0,d1 *モード設定
IOCS _TABLET
move.l a3,d0
beq @f
*既に常駐、設定変更
move.w GPen(pc),GPen-SS(a3)
bsr keepsub
pea LR5(pc)
bra PE *end
@@:
**セット
suba.l a1,a1
SUPER
movea.l d0,a1
move.l SET232C_,SET232C_JMP+2
lea SET232C-SS(a4),a0
move.l a0,SET232C_
*move.l #SET232C,SET232C_
move.l LOF232C_,LOF232C_JMP+2
lea LOF232C-SS(a4),a0
move.l a0,LOF232C_
move.l INP232C_,INP232C_JMP+2
lea INP232C-SS(a4),a0
move.l a0,INP232C_
move.l ISNS232C_,ISNS232C_JMP+2
lea ISNS232C-SS(a4),a0
move.l a0,ISNS232C_
move.l OSNS232C_,OSNS232C_JMP+2
lea OSNS232C-SS(a4),a0
move.l a0,OSNS232C_
move.l OUT232C_,OUT232C_JMP+2
lea OUT232C-SS(a4),a0
move.l a0,OUT232C_
USER
bsr keepsub
pea LRKP(pc)
DOS _PRINT
addq #4,sp
clr.w -(sp)
move.l #EndStatio-StartStatio,-(sp)
DOS _KEEPPR
****************
keepsub:
pea LR2(pc)
DOS _PRINT
addq #4,sp
* lea LMMO(pc),a0
* move.w GPen(pc),d0 *ボタンモード
* beq @f
* lea LGMO(pc),a0
*@@:
* move.l a0,-(sp)
* DOS _PRINT
* addq #4,sp
rts
free: *****************************常駐解除
move.l a3,d0
bne @f
pea LR8(pc) **非常駐
bra PE *end
@@: cmpi.w #$3F,d1
beq @f
pea LR4(pc) **ベクタが占領
bra PE *end
@@: suba.l a1,a1
SUPER
movea.l d0,a1
move.l (SET232C_JMP-SS)+2(a3),SET232C_
move.l (LOF232C_JMP-SS)+2(a3),LOF232C_
move.l (INP232C_JMP-SS)+2(a3),INP232C_
move.l (ISNS232C_JMP-SS)+2(a3),ISNS232C_
move.l (OSNS232C_JMP-SS)+2(a3),OSNS232C_
move.l (OUT232C_JMP-SS)+2(a3),OUT232C_
USER
sub.l #$00000F0,a3
move.l a3,-(sp)
DOS _MFREE
addq #4,sp
pea LR3(pc)
PE: DOS _PRINT
addq.w #4,sp
DOS _EXIT
LRKP: .dc.b ' 常駐しました。',$0d,$0a,0
.even
LR3: dc.b ' 常駐解除しました。',$0d,$0a,0
.even
LR4: dc.b ' ベクタが占領されています。',$0d,$0a,0
.even
LR5: .dc.b ' TnTABLET系ドライバの設定を変更しました。',$0d,$0a,0
.even
LR6: .dc.b ' コマンドラインが異常です。',$0d,$0a,0
.even
LR7: .dc.b ' スイッチが異常です。',$0d,$0a,0
.even
LR8: .dc.b ' 常駐していません。',$0d,$0a,0
.even
LRTTN: .dc.b ' TnTABLET系ドライバが常駐していません。常駐して下さい。',$0d,$0a,0
.even
LRTTO: .dc.b ' TABLET CALLのバージョンが古いです。',$0d,$0a,0
.even
*LMMO: .dc.b ' 毛筆感筆圧でエミュレートします。',$0d,$0a,0
* .even
*LGMO: .dc.b ' Gペンっぽい筆圧でエミュレートします。',$0d,$0a,0
* .even
LRH:
.dc.b $0d,$0a
.dc.b '使用法:CALEMU.x [switch]',$0d,$0a
.dc.b ' /R ・・・・ 常駐解除します。',$0d,$0a
*.dc.b ' /M ・・・・ 毛筆感筆圧でエミュレートします。',$0d,$0a
*.dc.b ' /G[n] ・ Gペンっぽい筆圧でエミュレートします。',$0d,$0a
.dc.b $0d,$0a,0
.even
LR1: dc.b 'CalcompTablet Emu. for TnTABLET系 Version 0.10 Copyright 1994 1995 TNB製作所',$0d,$0a,0
.even
LR2: dc.b ' TnTABLET系ドライバのタブレットでカルコンプタブレットエミュレートします',$0d,$0a
dc.b ' ★筆圧のみエミュレート、マチエールなら大丈夫バージョン★',$0d,$0a
.dc.b 0
.even
*
* 見ての通りかなりREM文があり見苦しい物があります。
* 再コンパイルは、途中に Cソースを入れるため面倒に
* なってます。ご了承ください
*
.ds.b 2048
usrsp: